/**
 * 用户信息脱敏工具函数
 */

/**
 * 对字符串进行脱敏处理，隐藏中间字符
 * @param {string} str - 需要脱敏的字符串
 * @param {number} keepStart - 保留开头字符数，默认为1
 * @param {number} keepEnd - 保留结尾字符数，默认为1
 * @param {string} maskChar - 脱敏字符，默认为'*'
 * @returns {string} 脱敏后的字符串
 */
export function maskString(str, keepStart = 1, keepEnd = 1, maskChar = '*') {
  if (!str || typeof str !== 'string') {
    return str
  }

  const length = str.length

  // 如果字符串长度小于等于保留字符总数，则不脱敏
  if (length <= keepStart + keepEnd) {
    return str
  }

  // 计算需要脱敏的字符数
  const maskLength = length - keepStart - keepEnd
  
  // 构建脱敏字符串
  const startPart = str.substring(0, keepStart)
  const endPart = str.substring(length - keepEnd)
  const maskPart = maskChar.repeat(Math.min(maskLength, 3)) // 最多显示3个星号

  return startPart + maskPart + endPart
}

/**
 * 对用户名进行脱敏处理
 * @param {string} username - 用户名
 * @returns {string} 脱敏后的用户名
 */
export function maskUsername(username) {
  if (!username) return username
  
  // 用户名保留首尾各3个字符，确保能识别账号
  return maskString(username, 3, 3)
}

/**
 * 对邮箱进行脱敏处理
 * @param {string} email - 邮箱地址
 * @returns {string} 脱敏后的邮箱
 */
export function maskEmail(email) {
  if (!email || !email.includes('@')) return email
  
  const [localPart, domain] = email.split('@')
  
  // 本地部分脱敏：保留首尾各3个字符，确保能识别账号
  const maskedLocal = maskString(localPart, 3, 3)
  
  return `${maskedLocal}@${domain}`
}

/**
 * 对姓名进行脱敏处理
 * @param {string} name - 姓名
 * @returns {string} 脱敏后的姓名
 */
export function maskName(name) {
  if (!name) return name
  
  // 姓名保留首尾各2个字符，确保能识别
  return maskString(name, 2, 2)
}

/**
 * 对用户显示名称进行脱敏处理
 * @param {string} displayName - 显示名称
 * @param {string} type - 类型：'username', 'email', 'name'
 * @returns {string} 脱敏后的显示名称
 */
export function maskUserDisplayName(displayName, type = 'auto') {
  if (!displayName) return displayName
  
  // 自动检测类型
  if (type === 'auto') {
    if (displayName.includes('@')) {
      type = 'email'
    } else if (displayName.length <= 4) {
      type = 'name'
    } else {
      type = 'username'
    }
  }
  
  switch (type) {
    case 'email':
      return maskEmail(displayName)
    case 'name':
      return maskName(displayName)
    case 'username':
    default:
      return maskUsername(displayName)
  }
}